16−11 AdvancedFilterメソッドによる抽出

上記の表から日付を指定し、下記マクロで抽出するケース。
Sub 2ykt8a()
'検索デ−タセット
hiz = "00/1/7"
Cells(2, 5) = hiz
'抽出実行
Range(Cells(1, 1), Cells(5, 2)).AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("E1:E2"), _
CopyToRange:=Range("E5:F6"), Unique:=False
End Sub
キーワード日付を上記例では、hiz = "00/1/7"
で行なっているが、 hiz = "2000/1/7"と
指定してもよい。但しhiz = "1/7/00"
はExcelで自動的に日付形式に変わらず不可。
99年については、 hiz = "12/1/99"、hiz = "99/12/1"、
hiz = "1999/12/01"のどの形式で指定してもOK。
(Excel95、97、2000共同様に、"12/1/99"はOKで、"1/7/00"はダメ)
上記で"1/7/00"が日付型に自動変換されなかったので、下記マクロはCDate関数で
日付型に変換後抽出を実施し問題なく実行できた。
Sub 2ykt8b()
'検索デ−タセット
hiz = "1/7/00"
hiz = CDate(hiz)
Cells(2, 5) = hiz
'抽出実行
Range(Cells(1, 1), Cells(5, 2)).AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("E1:E2"), _
CopyToRange:=Range("E5:F6")
End Sub
本例で判ったが、年の2桁を"99"と"00"がExcel上で全く同様になるとは限らないので、
"00"を使用した場合は、CDate関数で日付型に変換するマクロにした方が良い。
なお本ケースの場合、時間は関係ないので、hiz=DateValue(hiz)
のように日付を戻すDateValue関数を使用してもよい。
注1.本項の図面で、セル"E2"が"2000/1/7"と上の枠に表示せれていましが、これはコントロール
パネルで設定した形式になります。
(このPCでは[Windows]→[コント ロールパネル]→[地域]→[日付]→(yyyy/mm/dd)となっている)
※ 16-10・16-11と抽出関連を記述しましたが、16-10の"AutoFilter"は
シートに表示されている表示形式と合わないと抽出できないが、16-11は
表示形式は関係なく日付で抽出するのでマクロ作成は"AdvancedFilter"の方が
間違いが起きない。
16−12 仕掛かり日数計算
システム日付を"2000/3/1"に設定し、下記マクロを実行したケース。
| スタート日 |
2000/3/1までの日数 |
| 1999/12/1 |
91日 |
| 1999/12/10 |
82日 |
| 1999/12/31 |
61日 |
| 2000/1/7 |
54日 |
| 2000/2/28 |
2日 |
Sub 2ykt9()
kyo = DateValue(Now())
Cells(1, 2) = kyo & "までの日数"
For i = 2 To 6
Cells(i, 2) = kyo - Cells(i, 1) & "日"
Next
End Sub
※ Excel95、Excel97、Excel2000とも問題なし
16−13 日付の置換え
本項は、1999年と2000年で相違があるかチェックした。99の2桁指定は出来るが、
00の2桁は自動的に2000に変ると言う相違はあったが、マクロ上では問題なし。
| 表1.コントロールパネル"yy/MM/dd" |
表2.コントロールパネル"MM/dd/yy" |
|
|
上表のようにコントロ−ルパネル(16-11項注1参照)を変えて、下記マクロを実行
(本例は、11日を12日に替えるマクロ)
Sub 2ykt10()
Dim ymd1 As Date
Dim ymd2 As Date
ymd1 = #2000/01/11#
ymd2 = #2000/01/12#
Cells.Replace What:=ymd1, Replacement:=ymd2, LookAt:= _
xlPart, SearchOrder:=xlByRows, MatchCase:=False
End Sub
・置換えの場合マクロは日付形式で行っているので、コントロ−ルパネル設定は影響しない。
・マクロ実行上関係ないが、1999の場合は「ymd1=#99/01/11#」「ymd1=#1999/01/11#」の両指定OK
・2000年の場合は、00と書いても2000に自動的に変る
・なお上記の変数へ入力形式は、"ymd1=#年/月/日#"で1999/2000年とも同じ。
16−14 日付を基準にピポットテ−ブル作成
下記表がワ−クシ−トにあり、そのデ−タをマクロによりピポットテ−ブルにまとめたケ−ス。
何の問題も無し。
| 1 |
日付 |
時間 |
製品 |
数量 |
| 2 |
02/28 |
09:21 |
A |
13 |
| 3 |
02/28 |
10:10 |
C |
33 |
| 4 |
02/28 |
10:55 |
B |
44 |
| 5 |
02/28 |
11:32 |
C |
55 |
| 6 |
02/28 |
13:46 |
B |
20 |
| 7 |
02/28 |
13:47 |
A |
30 |
| 8 |
02/28 |
14:44 |
C |
15 |
| 9 |
02/28 |
15:11 |
C |
77 |
|
| 10 |
02/28 |
16:26 |
A |
66 |
| 11 |
02/29 |
09:10 |
B |
99 |
| 12 |
02/29 |
10:20 |
A |
55 |
| 13 |
02/29 |
11:01 |
C |
66 |
| 14 |
02/29 |
11:38 |
B |
88 |
| 15 |
02/29 |
13:55 |
C |
78 |
| 16 |
02/29 |
16:44 |
A |
25 |
| 17 |
02/29 |
17:05 |
C |
65 |
| 18 |
02/29 |
17:10 |
B |
85 |
|
| 19 |
03/01 |
10:05 |
A |
73 |
| 20 |
03/01 |
10:20 |
B |
43 |
| 21 |
03/01 |
11:33 |
C |
59 |
| 22 |
03/01 |
13:55 |
C |
58 |
| 23 |
03/01 |
14:44 |
B |
19 |
| 24 |
03/01 |
15:55 |
C |
35 |
| 25 |
03/01 |
16:22 |
B |
48 |
| 26 |
03/01 |
16:33 |
C |
65 |
| 27 |
03/01 |
17:00 |
A |
78 |
|
Sub 2ykt11()
Range("G6").Select
ActiveSheet.PivotTableWizard SourceType:=xlDatabase, SourceData:= _
"Sheet1!R1C1:R27C4", TableDestination:="R6C7", TableName:= _
"ピボットテーブル4"
ActiveSheet.PivotTables("ピボットテーブル4").AddFields RowFields:="日付", _
ColumnFields:="製品"
ActiveSheet.PivotTables("ピボットテーブル4").PivotFields("数量").Orientation _
= xlDataField
End Sub
16−15 システム時計の2001年移行確認
下記マクロを実行でメッセージが2001年に変わることを確認。
Sub y2kt12()
Date = #2000/12/31#
Time = #23:59:56#
MsgBox "現在のシステム時計 " & Date & " " & Time & Chr$(10) & _
"(約5秒経ってから[OK]をクリックして下さい)"
MsgBox "現在のシステム時計 " & Date & " " & Time & Chr$(10) & _
"(2001/01/01になっていればシステムは正常)"
End Sub
(このマクロはシステム時刻を変えています。現在日付に再セットが必要)
16−16 システム時計の[1999/09/09]移行確認
下記マクロを実行でメッセージが[1999/09/09]に変わることを確認。
Sub y2kt13()
Date = #99/09/08#
Time = #23:59:56#
MsgBox "現在のシステム時計 " & Date & " " & Time & Chr$(10) & _
"(約5秒経ってから[OK]をクリックして下さい)"
MsgBox "現在のシステム時計 " & Date & " " & Time & Chr$(10) & _
"(1999/09/09になっていればシステムは正常)"
End Sub
(このマクロはシステム時刻を変えています。現在日付に再セットが必要)
参考16−2:セルへ2桁年を入力の注意点
Excelワ−クシ−トのセルへ2桁の年(文字列に記載の数値を→日付の列へ)を入力
した場合下表となる。
※ 年を2桁で入力した場合下表のごとく訳が分からなくなるので、ダイレクトに
セルへ手入力する場合は2001年以降は4桁にした方がよい。
★Excel2000では「/」で区切って入力した場合すべ「西暦」となります。
16−21 Excel2000 年号の2桁入力参照の事。
(1)和暦入力(xx/xx/xx形式)(コントロールパネル"yy/MM/dd")(Excel95/97共同じ)

19**年代は左表のように年を最後にしても、32年以降であれば自動的に19**になり
特に影響無かったが、2000年代では不可。
(2)西暦入力(xx-xx-xx形式)(コントロールパネル"yy/MM/dd")

もし上例のように入力されている方は、Excel95とExcel97で異なるので注意
(3)コントロールパネル"MM/dd/yy"に設定時
(通常この設定のPCは少ないと思われる)

上表のように日付型に変らなのが多い。
16−17 マクロで2桁年入力
下記は2桁年をマクロ処理した例である。自作のダイアログやインプットボックス
から2桁で入力した場合も、コントロールパネルの設定により内容が変わる。
98・99のように31日より多い数字は自動的に年に変わったが、2000〜2031に
ついては日か年か区別のがつかずコントロールパネルの設定通りの日付となる
※コントロールパネルの設定は各PCで同じとは言えず、作成したマクロを不特定多数の
方が使用するケースでは混乱を避けるため2000年以降の年指定は4桁にした方がよい。
Sub y2kt14a()
'コントロールパネル"yy/MM/dd"に設定で実行
Cells(11, 1) = DateValue("01/01/00") '2000/1/1 日の無い数字は"MM/dd/yy"と成る
Cells(12, 1) = DateValue("01/01/01") '2001/1/1
Cells(13, 1) = DateValue("01/01/31") '2001/1/31
Cells(14, 1) = DateValue("01/01/32") '2032/1/1 ★Excel2000は(1932/1/1)
Cells(15, 1) = DateValue("02/01/01") '2002/1/1
Cells(16, 1) = DateValue("12/01/01") '2012/1/1
Cells(17, 1) = DateValue("29/01/01") '2029/1/1
Cells(18, 1) = DateValue("30/01/01") '1930/1/1
Cells(19, 1) = DateValue("99/01/01") '1999/1/1
End Sub
Sub y2kt14b()
'コントロールパネル"MM/dd/yy"に設定で実行
Cells(11, 1) = DateValue("01/01/00") '1/1/2000
Cells(12, 1) = DateValue("01/01/01") '1/1/2001
Cells(13, 1) = DateValue("01/01/31") '1/1/1931
Cells(14, 1) = DateValue("01/01/32") '1/1/1932
Cells(15, 1) = DateValue("02/01/01") '2/1/2001
Cells(16, 1) = DateValue("12/01/01") '12/1/2001
Cells(17, 1) = DateValue("20/01/01") '1/1/2020 月の無い数字は"yy/MM/dd"と成る
Cells(18, 1) = DateValue("21/01/01") '1/1/2021 月の無い数字は"yy/MM/dd"と成る
End Sub
16−18 現在日付以前を消去マクロ
| 表1.マクロ実施前 |
表2.マクロ実施後 |
|
|
Sub y2kt15()
kyom = Date
Date = #2000/10/10#
hiz = DateValue(Now())
For i = 2 To 7
If Cells(i, 2) - hiz < 0 Then
Cells(i, 3) = DateValue(Cells(i, 2))
Cells(i, 2) = ""
End If
Next
Date = kyom
End Sub
※ Excel95、Excel97、Excel2000とも何の問題もなし
参考16−3:1900/2/29の注意点
2000年問題と関係ないが、知っている人は知っており特に新しい話ではないが、
Excelの1900/2/29に不具合がある件を参考に記載します。
| セルへ入力 |
シルアル |
セルへ入力 |
シルアル |
| 1899/12/31 |
文字列 |
|
|
| 1900/01/01 |
1 |
2000/01/01 |
36526 |
| 1900/02/28 |
59 |
2000/02/28 |
36584 |
| 1900/02/29 |
60 |
2000/02/29 |
36585 |
| 1900/2/30 |
文字列 |
2000/2/30 |
文字列 |
| 1900/03/01 |
61 |
2000/03/01 |
36586 |
・上表の2000年については実際に閏年であり問題ないが、1900/2/29は
存在しないがセルに入力できシリアル値も取得出来る。
(1900年の計算が必要な方は注意して下さい)
・Windows版は1900/1/1がシリアル値1として始まる。このホームページに
記載のシリアル値は全てWindows版であり、Macintosh(1904/1/2がシリアル値
1)のシリアル値と異なるので誤解のないようにして下さい。
・なお、上表でも判るように1899年以前をセルへ入力しても文字列になり日付
型にはなりません。
Sub y2kt16()
Dim hiza As Date
hiza = #1900/02/28# '#1900/02/29#はエラーで入力不可(正常)
hizb = CDate(60) 'このシリアル値は1900/3/1になって欲しい
hizc = DateValue("1900/2/28") '("1900/2/29")は実行時エラー13(正常)
Cells(10, 1) = hiza 'セルA10の表示"1900/2/29"
Cells(11, 1) = hizb 'セルA10の表示"1900/2/29"
Cells(12, 1) = hizc 'セルA10の表示"1900/2/29"
End Sub
・マクロでは、#1900/02/29#及び("1900/2/29")は指定出来ず正常。
・ただし、1900/1/1〜1900/2/29までは1日プラスして表示される。
16−19 Findメソッドによる抽出

上記の表から日付を指定し、下記マクロで抽出(本例は"2000/01/11"指定)
Sub y2kt17()
hiz = "2000/01/11"
On Error Resume Next
Range("B1:B8").Find(hiz, , , xlWhole, xlByColumns, xlNext, False).Activate
If Err = 91 Then
MsgBox hiz & "のDATAなし"
Else
ra = ActiveCell.Row
Cells(2, 5) = Cells(ra, 1)
Cells(2, 6) = DateValue(Cells(ra, 2))
Cells(2, 7) = Cells(ra, 3)
End If
End Sub
上記マクロのように変数"hiz"はバリアント型で指定することも出来るが、
日付を抽出するのであれば、下記マクロのように始めから日付型を宣言して
使用した方が間違いは起きない。
Sub y2kt17()
Dim hiz As Date
hiz = #2000/01/11#
Y2K.Q&A-1 和暦優先の変換機能を変えられますか?
Q.愛知県 M.Iさんからの質問(以下原文)
|
私も仕事でVBAをたまに使います。
「2.2000年問題自作マクロの各種検証事例」は大変参考になりました。
「そんなことマイクロソフトへ聞け!」と言われてしまいそうですが、
聞いてしまいます。(笑)
Excelは年の入力際にスラッシュ区切り(「yy/mm/dd」形式)で入力
すると、和暦が優先されますよね。(00,65-99除く)
例えば今日なら「99/3/11」と誰もが入力すると思います。
来年になったらたぶん「00/1/1」と入力するでしょう。
ここまでは良いです。Excelの仕様(00,65-99除く)ですから。
その次の年(2001年)になっても普通の人は「01/1/1」と入力すると
思います。実はこれは「S64.1.1(1989/1/1)」になります。
この和暦優先という変換の機能を外すことってできるのでしょうか。
何かご存知でしたら教えてください。
|
(1)私の知っている限りでは地域指定が日本語になっている場合、
和暦優先の変換機能は変えられないと思います。
(2)ただし、[参考16−2:セルへ2桁年を入力の注意点(2)]の
ように西暦入力形式で「01-1-1」と入力した場合は2001年になります。
(3)それから日本人が日本国内でPCを使用するケースではあまり実用的
ではないが、参考までに記述すると、[設定][コントロールパネル][地域]を
[英語(US)]に設定した場合は、「01/01/01」〜「01/01/20」が2000年代になります
(21〜99は1900年代)(Excel95・97共同じ)。
※ 追記199/7/10
★Excel2000では「/」で区切って入力した場合すべ「西暦」となります。
16−21 Excel2000 年号の2桁入力参照の事。
(16-1〜16-10)|
(16-11〜16-19)|
(16-20〜)|
フレ−ム分割非対応の目次へ戻る